﻿/*  

* jQuery autoResize (textarea auto-resizer)  

* @copyright James Padolsey http://james.padolsey.com  

* @version 1.04  

*/



(function($) {
    $.fn.autoResize = function(options) {
        // Just some abstracted details, 
        // to make plugin users happy: 
        var settings = $.extend({
            onResize: function() { },
            animate: true,
            animateDuration: 150,
            animateCallback: function() { },
            extraSpace: 20,
            limit: 1000
        },
        options);
        // Only textarea's auto-resize:
        this.filter('textarea').each(function() {
            // Get rid of scrollbars and disable WebKit resizing:  
            var textarea = $(this).css({
                resize: 'none',
                'overflow-y': 'hidden'
            }),
            // Cache original height, for use later:  
      origHeight = textarea.height(),



            // Need clone of textarea, hidden off screen:  

      clone = (function() {



          // Properties which may effect space taken up by chracters:  

          var props = ['height', 'width', 'lineHeight', 'textDecoration', 'letterSpacing'],

          propOb = {};



          // Create object of styles to apply:  

          $.each(props, function(i, prop) {

              propOb[prop] = textarea.css(prop);

          });



          // Clone the actual textarea removing unique properties  

          // and insert before original textarea:  

          return textarea.clone().removeAttr('id').removeAttr('name').css({

              position: 'absolute',

              top: 0,

              left: -9999

          }).css(propOb).attr('tabIndex', '-1').insertBefore(textarea);



      })(),

        lastScrollTop = null,

        updateSize = function() {



            // Prepare the clone:  

            clone.height(0).val($(this).val()).scrollTop(10000);



            // Find the height of text:  

            var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,

          toChange = $(this).add(clone);



            // Don't do anything if scrollTip hasen't changed:  

            if (lastScrollTop === scrollTop) {

                return;

            }

            lastScrollTop = scrollTop;



            // Check for limit:  

            if (scrollTop >= settings.limit) {

                $(this).css('overflow-y', '');

                return;

            }

            // Fire off callback:  

            settings.onResize.call(this);



            // Either animate or directly apply height:  

            settings.animate && textarea.css('display') === 'block' ? toChange.stop().animate({

                height: scrollTop

            },

        settings.animateDuration, settings.animateCallback) : toChange.height(scrollTop);

        };



            // Bind namespaced handlers to appropriate events:  

            textarea.unbind('.dynSiz').bind('keyup.dynSiz', updateSize).bind('keydown.dynSiz', updateSize).bind('change.dynSiz', updateSize);



        });



        // Chain:  

        return this;

    };


})(jQuery); 
